#include "DRV8323.h"
#include "bsp_delay.h"

uint16_t errorstate01 , errorstate02;
uint16_t TIMP01, TIMP02, TIMP03, TIMP04, TIMP05;
uint16_t TIMP1, TIMP2, TIMP3, TIMP4, TIMP5;
char errorflag = 0;

 /**
  * @brief    【MOTOR-DRV8323 SPI通信】
  *             配置 DRV8323工作状态
  * @function  1 - SPI读&写一体化函数 16位 - HAL库函数版本
  * @function  2 - SPI功能异常提示函数
  * @function  3 - 用SPI配置DRV8323的函数  (操作封装)
*/

// 1 - SPI读&写一体化函数 16位 - HAL库函数版本
uint16_t SPI_ReadWrite_DRV8323(uint16_t ReadAddr)
{
	uint16_t value; 
	SPI1_nSCS_LOW();   // SPI3-nSCS 拉低使能  //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);
	HAL_Delay(100);      // 如果 LOW & HIGH 操作是使用的BSRR寄存器操作版本，需要加上延时（大概500），否则速度太快可能会出错！
	HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)&ReadAddr, (uint8_t*)&value, 1, 1000);  // 通过一个强制转换“骗过”库函数接口
	HAL_Delay(100);      // 如果 LOW & HIGH 操作是使用的BSRR寄存器操作版本，需要加上延时（大概500），否则速度太快可能会出错！
	SPI1_nSCS_HIGH();  // SPI3-nSCS 拉高关断  //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET);
	HAL_Delay(500);
	
	return value;
}

uint16_t SPI_ReadOnly_DRV8323()
{
	uint16_t value; 
	SPI1_nSCS_LOW();   // SPI3-nSCS 拉低使能  //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);
	HAL_Delay(100);      // 如果 LOW & HIGH 操作是使用的BSRR寄存器操作版本，需要加上延时（大概500），否则速度太快可能会出错！
	HAL_SPI_Receive_IT(&hspi1, (uint8_t*)&value,1);  // 通过一个强制转换“骗过”库函数接口
	HAL_Delay(100);      // 如果 LOW & HIGH 操作是使用的BSRR寄存器操作版本，需要加上延时（大概500），否则速度太快可能会出错！
	SPI1_nSCS_HIGH();  // SPI3-nSCS 拉高关断  //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET);
	HAL_Delay(500);
	
	return value;
}

// 2 - SPI功能异常提示函数
void SPI_ERROR_UserCallback(void)
{
	/* 等待超时后的处理,输出错误信息 */
	errorflag = 1;
}

// 3 - 用SPI设置DRV8323的函数  (操作封装)
void Set_DRV8323(void)
{
	Drv8323_ENABLE();//使能Drv-Enable输入高电平，驱动芯片开始工作
	
    HAL_Delay(200);
	TIMP01 = SPI_ReadWrite_DRV8323(0x1001); //address 02
	TIMP02 = SPI_ReadWrite_DRV8323(0x1bff); //address 03
	TIMP03 = SPI_ReadWrite_DRV8323(0x27ff); //address 04
	TIMP04 = SPI_ReadWrite_DRV8323(0x2a59); //address 05
	TIMP05 = SPI_ReadWrite_DRV8323(0x30C3); //address 06// 32c3
	
    HAL_Delay(200);
	errorstate01 = SPI_ReadWrite_DRV8323(0x8000);
	errorstate02 = SPI_ReadWrite_DRV8323(0x8800);
	TIMP1 = SPI_ReadWrite_DRV8323(0x9000);//取地址0x02
	TIMP2 = SPI_ReadWrite_DRV8323(0x9800);//取地址0x03
	TIMP3 = SPI_ReadWrite_DRV8323(0xA000);//取地址0x04
	TIMP4 = SPI_ReadWrite_DRV8323(0xA800);//取地址0x05
	TIMP5 = SPI_ReadWrite_DRV8323(0xB000);//取地址0x06
	
//	errorstate01 = (errorstate01 & 0x7FF);
//	errorstate02 = (errorstate02 & 0x7FF);
//	TIMP1 = (TIMP1 & 0x7FF);
//	TIMP2 = (TIMP2 & 0x7FF);
//	TIMP3 = (TIMP3 & 0x7FF);
//	TIMP4 = (TIMP4 & 0x7FF);
//	TIMP5 = (TIMP5 & 0x7FF);
	//Drv8323_DISABLE();//使能Drv-Enable输入低电平，驱动芯片停止工作
	//在这里就关的话就用不了啦！
}

 /**
  * @brief    【MOTOR-DRV8323 芯片使能】
  * @function  1 - DRV8323的芯片使能
	* @function  2 - DRV8323的芯片关闭
*/
// 1 - DRV8323的芯片使能
void Drv8323_ENABLE(void)   //DRV8323 Enable
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
}
// 2 - DRV8323的芯片关闭
void Drv8323_DISABLE(void)   //DRV8323 Disable
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}

void Fault_remove(){
	
}